
function queryStringify(obj) {
    let str = ''
    for (let k in obj) {
        str += k + '=' + obj[k] + '&'
    }
    return str.slice(0, -1)
}

function ajax(options = {}) {
    // console.log(options)
    const { url, method, async, data, headers, dataType, success } = options
    if (!url)  throw new Error('url 为必填选项, 请传递此项内容, ^_^')

    if (!(method === undefined || /^get|post$/i.test(method)))  throw new Error('method 目前只接受 "GET" 或者 "POST" 方式, 请期待更新 (#^.^#)')

    if (!(async === undefined || typeof async === 'boolean'))  throw new Error('async 需要传递一个 "Boolean" 类型数据呦 O(∩_∩)O哈哈~')

    if (!(data === undefined || typeof data === 'string' || Object.prototype.toString.call(data) === '[object Object]'))  throw new Error('data 需要传递一个 "String" 或者 "Object" 类型数据 o(*￣︶￣*)o')

    if (!(headers === undefined || Object.prototype.toString.call(headers) === '[object Object]'))  throw new Error('headers 需要传递一个 "Object" 类型数据 o(*￣︶￣*)o')

    if (!(dataType === undefined || /^(json|string)$/i.test(dataType)))  throw new Error('dataType 目前只接受 "json" 或者 "string" 两种值')

    if (!(success === undefined || typeof success === 'function'))  throw new Error('success 需要传递一个 "Function" 类型数据')
    
    const _default = {
        url: url,
        method: method || 'GET',
        async: async ?? true,
        data: data || '',
        headers: { 'content-type': 'application/x-www-form-urlencoded', ...headers },
        dataType: dataType || 'string',
        success: success || function () { }
    }
    if (typeof _default.data === 'object') {
        _default.data = queryStringify(_default.data)
    }
    if (/^get$/i.test(_default.method) && _default.data) {
        _default.url += '?' + _default.data
    }
    const xhr = new XMLHttpRequest()
    xhr.open(_default.method, _default.url, _default.async)
    xhr.onload = function () {
        const res = _default.dataType === 'string' ? xhr.responseText : JSON.parse(xhr.responseText)
        _default.success(res)
    }
    for (let k in _default.headers) {
        xhr.setRequestHeader(k, _default.headers[k])
    }
    /^get$/i.test(_default.method) ? xhr.send() : xhr.send(_default.data)
}

function pAjax(options = {}) {
    // 异步的 ajax 代码
    // 利用 Promise 语法
    const p = new Promise((resolve, reject) => {
      // 书写 ajax 代码
      ajax({
        url: options.url,
        data: options.data,
        async: options.async,
        method: options.method,
        headers: options.headers,
        dataType: options.dataType,
        success (res) {
          // 调用 resolve 让本次 Promise 转换为成功
          resolve(res)
        }
      })
    })
   
    return p
  }